import collections
from random import choice
'''
标题：Python风格的纸牌
体验 __len__ 与 __getitem__：Python内部函数
感受：实现__getitem__方法，该类自动可切片，可迭代
问题遗留：无法洗牌。要使用__setitem__方法 
'''

# 建立一个纸牌 namedtuple构建只有少数属性但是没有方法的对象（简单类）
Card = collections.namedtuple('Card', ['rank', 'suit'])


class FrenchDeck: # Python3中默认继承object
    # 纸牌：2~A
    rank = [str(n) for n in range(2, 11)] + list('JQKA')
    # 花色：黑桃，菱形，梅花，红心
    suit = 'spades diamonds clubs hearts'.split()

    def __init__(self):
        # 初始化生成52张牌 放入Card对象
        self._cards = [Card(rank, suit) for suit in self.suit for rank in self.rank]

    def __len__(self):
        return len(self._cards)

    # __getitem__ 自动处理[]获取操作：返回如下
    def __getitem__(self, position):
        return self._cards[position]


# 排序方法
# 定义花色数值
suit_values = dict(spades=3, hearts=2, diamonds=1, clubs=0)


# 计算牌值
def spades_high(card):
    rank_value = FrenchDeck.rank.index(card.rank)
    return rank_value * len(suit_values) + suit_values[card.suit]


if __name__ == '__main__':
    beer_card = Card('7', 'diamonds')
    # print(beer_card)
    deck = FrenchDeck()
    print(len(deck))
    print(deck[0])  # 由__getitem__提供
    # print(deck._cards)
    # 使用python的随机抽取 choice函数
    print(choice(deck))
    # 1.迭代
    for card in deck[12::13]:
        print(card)
    # 2.排序: 使用spade_high方法排序
    for card in sorted(deck[12::13], key=spades_high):
        print(card)
